A/D変換の分解能向上のノウハウ
Vref+,Vref−端子を使ってA/D変換の測定分解能を向上させる
実際にどの程度の電圧が測定できるのかを考えてみます。通常のアナログリファレンス(VREF)は、デバイスのVDD
とVSS です。絶対変換精度は±1LSB(10ビットであることから、1/1024)となっていますので、PICの電源電圧がVDD=5Vであるときには、測定できる最小の電圧(測定分解能)は、次のように見積られます。
測定分解能=5V/1024=約5mV (VDD=5V,VSS=0V時)
もし、測定する電圧が、たとえば1V〜4Vの範囲に限定されるとしたら、A/D変換の測定分解能を上げる方法があります。これまで、アナログリファレンス(VREF)は、デバイスのVDD
とVSSを基準にしていましたが、Vref+=4V,Vref−=1Vに設定することで、測定分解能を向上させることができます。すなわち、
測定分解能=(4V−1V)/1024=約3mV (Vref+=4V,Vref−=1V時)
というように、測定分解能が約40%UPすることになります。
「Vref+」は正極アナログリファレンス電圧端子、「Vref−」は負極アナログリファレンス電圧端子と呼ばれています。RAポートの3ピンがVref+端子、2ピンがVref-端子になっています。
ただし仕様上、表1に示すように、アナログリファレンス関連の電圧範囲には制限がありますので注意が必要です。
記号 | 特性 | Min | Typ | Max |
Vref | アナログリファレンス電圧 (Vref+ − Vref-) |
2.0V | − | VDD + 0.3V |
Vref+ | 正極アナログリファレンス電圧 | AVDD − 2.5V | AVDD + 0.3V | |
Vref− | 負極アナログリファレンス電圧 | AVSS − 0.3V | VREF+ − 2.0V | |
VAIN | アナログ入力電圧 | VSS − 0.3V | − | VREF+ + 0.3V |
A/D変換器のポートを選ぶ
A/D変換器の入力ポートですが、PIC16F877は、(RA0/AN0),(RA1/AN1), (RA2/AN2),(RA3/AN3),(RA5/AN4),(RE0/AN5)
, (RE1/AN6) , (RE2/AN7) の全8ポートあります。ここでは、A/D変換入力ポートとして、(RA0/AN0)を使います。正極アナログリファレンス電圧端子(Vref+)は、3ピンの(RA3/AN3)であり、負極アナログリファレンス電圧端子(Vref-)は、2ピンの(RA2/AN2)となっています。ここで、「A/D変換の制御法」の表3.A/D ポートの設定表にて、A/Dポートの設定を確認します。PCFGx=「1111」のとき、(RA0/AN0)がA/D変換入力ポートとなり、3ピンの(RA3/AN3)がVref+、2ピンの(RA2/AN2)がVref-に設定されます。他のポートはディジタル入出力ポートになることが分かります。
さらに、「A/D変換の制御法」の表1.ADCON0レジスタの機能説明表にて、アナログチャネル指定ビットですが、CHSx=「000」とすることで、CH0(RA0)の指定になります。
A/D結果レジスタの右/左詰めについて
これまでの例と同様に、結果を右詰めにします。したがって、
ADRESH<1:0>→PortB<1:0>
ADRESL<7:0>→PortD<7:0>
という配置に出力させます。
すなわち、10ビットのMSBから順に<RB1,RB0,RD7,RD6,・・・,RD0>とします。
A/D変換のクロックの選択
「A/D変換の制御法」の表4.A/D変換用クロックの選択を参照してください。20MHzのシステムクロックでは、Fosc/32を選択することになります。よって、ADCS1=「1」,ADCS0=「0」と決まります。
ADCON0レジスタの決定
(「A/D変換の制御法」の図1. ADCON0レジスタの構成を参照してください)
ADCON0レジスタの内容の決定
ということで、ADCON0→B’10000001’ (81H)
ADCON1レジスタの決定
(「A/D変換の制御法」の図2. ADCON1レジスタの構成を参照してください)
ADCON1レジスタの内容の決定
ということで、ADCON1→B’10001111’ (8FH)
ハード側の接続について
A/D変換の結果を簡単に確認するためLEDを接続し点灯させます。LEDの接続ポートですが、先ほどの例のように私のターゲットボードでは、PortBとPortDが隣り合って並んでいますので、図1のように10ビットのMSBから順に<RB1,RB0,RD7,RD6,・・・,RD0>と接続します。アナログ入力の関連端子ですが、可変抵抗と2つの固定抵抗を直列にし、それぞれバッファ回路を通して接続します。Vref+端子となる(RA3/AN3)には可変抵抗の高電位側(A点)に接続し、Vref-端子となる(RA2/AN2)には低電位側(B点)に接続します。A/D変換入力端子となる(RA0/AN0)は可変抵抗の中間タップに接続します。バッファ回路の出力に0.1μFのセラミック・コンデンサを接続しましたが、これは無くてもかまいません。ただし、バッファ回路の出力配線が長い場合には、バッファ回路(μPC451)が不安定になることがあります。一応、発振防止のために、セラミック・コンデンサを付けてあります。
<注意事項>
![]() |
図1.Vref+,Vref-端子を使ったA/D変換の動作確認回路 |
アナログ入力端子ですが、テスタなどを接続してアナログの電圧値が分かるようにします。
A/D変換入力端子の電圧範囲を見積ります。
VDD=5Vとして、
最小電圧=5V×2.7kΩ/(4.7kΩ+10kΩ+2.7kΩ)=約0.78V
最大電圧=5V×(10kΩ+2.7kΩ)/(4.7kΩ+10kΩ+2.7kΩ)=約3.65V
すなわち、約0.78V〜3.65Vまでの2.87V幅になります。この設計において、表1のアナログリファレンス関連の仕様範囲を満たすかどうか確認します。表2に仕様と設計値を比較した結果を示します。(設計値は、いずれも仕様範囲内である)
記号 | 特性 | 設計値 | 仕様 | ||
Min | Typ | Max | |||
Vref | アナログリファレンス電圧 (Vref+ − Vref-) |
3.65V−0.78V =2.87V |
2.0V | − | VDD + 0.3V =5V+0.3V =5.3V |
Vref+ | 正極アナログリファレンス電圧 | 3.65V | AVDD − 2.5V =5V-2.5V =2.5V |
AVDD + 0.3V =5V+0.3V =5.3V |
|
Vref− | 負極アナログリファレンス電圧 | 0.78V | AVSS − 0.3V =0V−0.3V =−0.3V |
VREF+ − 2.0V =3.65V−2.0V =1.65V |
|
VAIN | アナログ入力電圧 | 0.78V〜3.65V | VSS - 0.3V =0V-0.3V =−0.3V |
− | VREF+ +0.3V =3.65V+0.3V =3.95V |
A/D変換動作確認プログラム(4)
図2にA/D変換のフローチャートを示します。
プログラムの解説については、「プログラムの説明(4)」の項をご参照ください。
![]() |
図2.A/D変換プログラム(4) フローチャート |
(注)以下に示すプログラムには、ホームページ画面作成の都合上、空白として全角文字のスペースなどが挿入されています。したがって、下記プログラムリストをそのままコピーしてMPLABのソースファイルとされた場合には、エラーとなることがあります。
→ここをクリックして、下記のプログラムをダウンロードするようにしてください。
ファイル名:「adconv4.asm」 サイズ2.28kバイト
→ここをクリックして、下記のオブジェクトファイルをダウンロードするようにしてください。
ファイル名:「adconv4.hex」 サイズ165バイト
プログラムリスト中、青字となっている行が、A/D変換プログラム(1)で変更された部分です。違いは、(6)の1行だけです。
;*********************************************************** ; A/D変換動作チェックプログラム(4) ; A/D変換入力端子(CH0/RA0) ; A/D変換の結果はLED点灯により確認 ; RB1(MSB),RB0,RD7,RD6,RD5,RD4,RD3,RD2,RD1,RD0(LSB) ; の10ビット ; Vref+(CH3/RA3), Vref-(CH2/RA2) 端子を使用 ; A/D 割り込みは使用せず、簡単のため GO ビットで判断 ;*********************************************************** |
|
LIST P=PIC16F877 INCLUDE P16F877.INC |
;(1)プロセッサの種別指定 ;(2)インクルードファイルの指定 |
;*********************************************************** ; 変数定義とレジスタ割付 ;*********************************************************** |
|
COUNT EQU 20H ORG 0 |
;(3)ループカウンタ ;(4)プログラムの開始番地の指定 |
;*********************************************************** ; 入出力ピン初期化 ;*********************************************************** |
|
BSF STATUS,RP0 MOVLW B'10001111' MOVWF ADCON1 CLRF TRISB CLRF TRISD BCF STATUS,RP0 MOVLW B'10000001' MOVWF ADCON0 |
;(5)Bank 1 へ切替 ;(6)RA0アナログ, Vref+, Vref-, 結果右詰 ;(7)ADCON1レジスタの設定 ;(8)PortB 出力モードに設定 ; PortD 出力モードに設定 ;(9)Bank 0 へ戻す ; ;(10)Fosc/32,CH0 設定, A/D on ;(11)ADCON0レジスタの設定 |
;*********************************************************** ; メインプログラム ;*********************************************************** |
|
ADSTART CALL TIME BSF ADCON0,GO WAIT BTFSC ADCON0,GO GOTO WAIT MOVF ADRESH,W MOVWF PORTB BSF STATUS,RP0 MOVF ADRESL,W BCF STATUS,RP0 MOVWF PORTD GOTO ADSTART |
; ;(12)23.2μs 一定時間待つ ; (2TAD [2×1.6μs]+アクィジション時間[20μs]) ;(13)A/D スタート ;(14)A/D が完了すると GOが0になる ;(15)GO が 0 だったらループから抜ける ; GO が 1 だったら WAIT へループする ;(16)A/D データ上位(データは右詰) ;(17)PortBへ A/D 結果を出力 ;(18)Bank 1 へ切替 ;(19)A/D データ下位 ;(20)Bank 0 へ戻す ;(21)PortDへ A/D 結果を出力 ;(22)A/D 変換を繰り返す |
;*********************************************************** ;23μs遅延サブルーチン(20MHzクロック時) ;*********************************************************** |
|
TIME MOVLW 25H MOVWF COUNT NOP LOOP DECFSZ COUNT,F GOTO LOOP RETURN END |
; ;(23)1サイクル 25H = 37 ;(24)1サイクル ;(25)1サイクル 微調整ダミー ; ;(26)1×(37-1)+2 = 38サイクル ;(27)2×(37-1) = 72サイクル ;(28)2サイクル ; 合計 115サイクル×0.2μs = 23μs ;(29)プログラム・ソースの終わり |
【プログラムの説明(4)】
このプログラムについて、解説を加えておきましょう。ただし、プログラムリスト中、青字となっている(6)の行以外は、プログラムの説明(1)と同じです。
他の行の解説は、こちらをクリックしてご覧ください。
(6)RA0アナログ, Vref+, Vref-, 結果右詰
A/D変換器の入力ポートとして、(RA0/AN0)を使います。正極アナログリファレンス電圧端子(Vref+)は、3ピンの(RA3/AN3)であり、負極アナログリファレンス電圧端子(Vref-)は、2ピンの(RA2/AN2)となっています。ここで、「A/D変換の制御法」の表3.A/D ポートの設定表にて、A/Dポートの設定を確認します。PCFGx=「1111」のとき、(RA0/AN0)がA/D変換入力ポートとなり、3ピンの(RA3/AN3)がVref+、2ピンの(RA2/AN2)がVref-に設定されます。他のポートはディジタル入出力ポートになることが分かります。
bit7: A/D 結果フォーマットセレクト:右詰=「1」
bit6: 機能なし(とりあえず「0」とでもしておく)
bit5: 機能なし(とりあえず「0」とでもしておく)
bit4: 機能なし(とりあえず「0」とでもしておく)
bit3: PCFG3=「1」
bit2: PCFG2=「1」
bit1: PCFG1=「1」
bit0: PCFG0=「1」
ということで、B’10001111’ (8FH)をWregにロードする。
A/D変換動作の確認
テスターで各電圧を測定します。(A点)の電圧は、実測 3.618V、(B点)の電圧は、0.774Vでした。すなわち、入力電圧の可変幅は、2.844V(0.774V〜3.618V)となります。
理論値の計算ですが、たとえば入力電圧が、2Vであった場合には、
1023×(2V−0.774V)/2.844V=442(数字は10進表示、端数は四捨五入)
というように計算できます。
表3で、ターゲットボードの値と理論値を比べてみると、最大1LSBの誤差があることが分かります。電圧換算すると、テスターでの測定誤差も含まれますが、
1/1023×2.884V=約2.8mVとなりました。
A/D変換 入力電圧 ( )内は実測値 |
出力結果 | |||||
ターゲットボード | 理論値 | |||||
2進 | 16進 | 10進 | 2進 | 16進 | 10進 | |
最大電圧 (3.618V) |
B’1111111111’ | H’3FF’ | D’1023’ | B’1111111111’ | H’3FF’ | D’1023’ |
3.0V (3.006V) |
B’1100100011’ | H’323’ | D’803’ | B’1100100010’ | H’322’ | D’802’ |
2.5V (2.501V) |
B’10011011101’ | H’26D’ | D’621’ | B’1001101101’ | H’26D’ | D’621’ |
2.0V (2.005V) |
B’0101111010’ | H’1BA’ | D’442’ | B’0110111010’ | H’1BA’ | D’442’ |
1.5V (1.504V) |
B’0100000101’ | H’105’ | D’261’ | B’0100000110’ | H’106’ | D’262’ |
1.0V (1.003V) |
B’0001010001’ | H’051’ | D’081’ | B’0001010010’ | H’052’ | D’082’ |
最小電圧 (0.775V) |
B’0000000000’ | H’000’ | D’000’ | B’0000000000’ | H’000’ | D’000’ |
失敗例
アナログ入力部ですが、簡単のため可変抵抗と2つの固定抵抗を使い、バッファ回路を使用せずに、図3のように接続しました。
![]() |
図3.Vref+,Vref-端子を使ったA/D変換の動作確認回路 失敗例 |
Vref入力ポート(RA3/AN3)には、A/D 変換サイクル中で、10μA程度の入力電流が流れます。
VDDから 4.7kΩを通して(RA3/AN3)ポートに、10μA程度の電流が流れるとすると、4.7kΩ×10μA=47mV変動します。これでは、A/D変換の測定分解能を上げる目的で構成した回路が、逆に変換精度を低下させていることになります。アナログ入力端子(特にVref+端子)には、必ずバッファ回路を接続して入力電流による電圧変動を抑えるか、または安定な電位に接続する必要があります。
記号 | 特性 | 仕様 | 備考 | ||
Min | Typ | Max | |||
IREF | Vref入力電流 (RA3ピン) |
10μA | − | 1000μA | VAIN 獲得中 |
− | − | 10μA | A/D 変換サイクル中 |
![]() |
|
![]() |